package com.yx.springai.chatclient.advisor;

import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * RereadingAdvisor 类用于在AI聊天客户端请求处理过程中提供重读功能。
 * 该类实现了 BaseAdvisor 接口，可以在请求发送前和响应返回后执行特定逻辑。
 */
public class RereadingAdvisor  implements BaseAdvisor {
    public static final String DEFAULT_USER_TDEXT_ADVISOR = """
            {re2_input_quert}
            解读这个问题: {re2_input_quert}
            """;
    
    /**
     * 在聊天客户端请求发送之前执行的方法。
     * 可以在此处修改请求参数或添加额外的处理逻辑。
     * 
     * @param chatClientRequest 聊天客户端请求对象，包含请求的相关信息
     * @param advisorChain 顾问链对象，用于继续执行链中的下一个顾问
     * @return 处理后的聊天客户端请求对象
     */
    @Override
    public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain advisorChain) {
        String contents = chatClientRequest.prompt().getContents();
        String re2InputQuert = PromptTemplate.builder().template(DEFAULT_USER_TDEXT_ADVISOR)
                .build()
                .render(Map.of("re2_input_quert", contents));
        ChatClientRequest.Builder mutate = chatClientRequest.mutate();

        Prompt prompt = Prompt.builder().content(re2InputQuert).build();
        ChatClientRequest build = mutate.prompt(prompt).build();
        return build;
    }

    /**
     * 在聊天客户端响应返回之后执行的方法。
     * 可以在此处对响应结果进行处理或修改。
     * 
     * @param chatClientResponse 聊天客户端响应对象，包含AI模型的响应结果
     * @param advisorChain 顾问链对象，用于继续执行链中的下一个顾问
     * @return 处理后的聊天客户端响应对象
     */
    @Override
    public ChatClientResponse after(ChatClientResponse chatClientResponse, AdvisorChain advisorChain) {
        return chatClientResponse;
    }

    /**
     * 获取顾问的执行顺序。
     * 数值越小，优先级越高，越先执行。
     * 
     * @return 顾问执行顺序的数值
     */
    @Override
    public int getOrder() {
        return 0;
    }
}